
package shopping

import (
    "strconv"
    "dhfshop/models"
	"dhfshop/models/sale"
	"github.com/astaxie/beego/orm"
)

type CartItem struct {
	CartItemId int64     `orm:"column(cart_item_id);pk;auto" json:"cart_item_id" form:"cart_item_id"`  // 购物车条目编号
	BuyerId    int64     `orm:"column(buyer_id)" json:"buyer_id" form:"-"`           //买家member_id
	ShopId     int64     `orm:"column(shop_id)" json:"shop_id" form:"-"`              //店铺编号
	ItemId     int64     `orm:"column(item_id)" json:"item_id,string" form:"-"`     //
	ItemIdStr string    `orm:"-" json:"-" form:"item_id"`
	SkuId      int64     `orm:"column(sku_id)" json:"sku_id,string" form:"-"`        // 需要精确到sku           
    SkuIdStr  string    `orm:"-" json:"-" form:"sku_id"`
	Image      string    `orm:"-" json:"image" form:"-"`                //不在此数据表中存储
	Title      string    `orm:"-" json:"title" form:"-"`                //不在此数据表中存储
	Price      float32   `orm:"-" json:"price" form:"-"`                //不在此数据表中存储
	Quantity   int       `orm:"column(quantity)" json:"quantity" form:"quantity"`     //
	
}

type Cart struct {
	BuyerId    int64        `orm:"-" json:"buyer_id" form:"buyer_id"`    //买家member_id
	TotalPrice float32      `orm:"-" json:"total_price" form:"-"`          //不在此数据表中存储,商品总价
	CartItems  []*CartItem  `orm:"-" json:"cart_items" form:"-"`  /* 反向关系,用来表述ORM存储关系和组合JSON输出*/
	SkuJson    string       `orm:"-" json:"-" form:"cart_items"`                        /* 临时存放上传的订单sku*/
}

func init() {
    orm.RegisterModel(new(CartItem))   
}

// 添加购物车项
func AddCart(m *CartItem) (id int64, err error) {
	o := models.GetDefaultDB()
	id, err = o.Insert(m)
	return
}
// 获取最新的购物车
func GetCarts(buyerId, shopId int64) (*Cart, error) {
	cart := new(Cart)
	o := models.GetDefaultDB()
	qs := o.QueryTable(new(CartItem))
	qs = qs.Filter("buyer_id", buyerId)
	if shopId > 0 {
	   qs = qs.Filter("shop_id", shopId)
	}
	var lists []*CartItem
	if _, err := qs.OrderBy("-cart_item_id").All(&lists); err != nil {
	    return cart, err
	}
	for _, cartItem := range lists {
	    if item, err := sale.GetItemByItemId(cartItem.ItemId); err == nil {
		    cartItem.Title = item.Title
		    cartItem.Image = item.Image
		}
		if sku, err := sale.GetSkuBySkuId(cartItem.SkuId); err == nil {
		    cartItem.Price = sku.SkuPrice
		}
		pCartItem := new(CartItem)
		pCartItem.CartItemId = cartItem.CartItemId
		pCartItem.BuyerId = cartItem.BuyerId
		pCartItem.ShopId = cartItem.ShopId
		pCartItem.ItemId = cartItem.ItemId
		pCartItem.SkuId = cartItem.SkuId
		pCartItem.Image = cartItem.Image
		pCartItem.Title = cartItem.Title
		pCartItem.Price = cartItem.Price
		pCartItem.Quantity = cartItem.Quantity
	    cart.CartItems = append(cart.CartItems, pCartItem)
		cart.TotalPrice = cart.TotalPrice + pCartItem.Price*float32(pCartItem.Quantity)
	}
	return cart, nil
}

func GetCartItemById(id int64) (v *CartItem, err error) {
	o := models.GetDefaultDB()
	v = &CartItem{CartItemId: id}
	if err = o.Read(v); err == nil {
		v.ItemIdStr = strconv.FormatInt(v.ItemId, 10)
		v.SkuIdStr = strconv.FormatInt(v.SkuId, 10)
		return v, nil
	}
	return nil, err
}


// 更新购物车项
func UpdateCart(m *CartItem, param ...string) (err error) {
	o := models.GetDefaultDB()
	v := CartItem{CartItemId: m.CartItemId}
	if err = o.Read(&v); err == nil {
		_, err = o.Update(m, param...)
		return
	}
	return
}

// 移出购物车项
func RemoveCart(id int) (err error) {
	o := models.GetDefaultDB()
	_, err = o.QueryTable(new(CartItem)).Filter("cart_item_id", id).Delete()
	return
}

// 清空购物车项
func EmptyCart(buyerId int) (err error) {
	o := models.GetDefaultDB()
	_, err = o.QueryTable(new(CartItem)).Filter("buyer_id", buyerId).Delete()
	return
}
